home *** CD-ROM | disk | FTP | other *** search
/ Giga Games 1 / Giga Games.iso / net / usenet / volume7 / nethack3 / patch2c < prev    next >
Encoding:
Internet Message Format  |  1989-08-19  |  59.4 KB

  1. Path: uunet!zephyr.ens.tek.com!tekgen!tekred!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v08i008:  NetHack3 -  display oriented dungeons & dragons (Ver. 3.0), Patch2c
  5. Message-ID: <4460@tekred.CNA.TEK.COM>
  6. Date: 18 Aug 89 15:48:35 GMT
  7. Sender: nobody@tekred.CNA.TEK.COM
  8. Lines: 2210
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
  12. Posting-number: Volume 8, Issue 8
  13. Archive-name: NetHack3/Patch2c
  14. Patch-To: NetHack3: Volume 7, Issue 56-93
  15.  
  16.  
  17.  
  18. #! /bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 3 (of 7)."
  25. # Contents:  patch02c
  26. # Wrapped by billr@saab on Fri Aug 18 08:43:01 1989
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'patch02c' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'patch02c'\"
  30. else
  31. echo shar: Extracting \"'patch02c'\" \(56848 characters\)
  32. sed "s/^X//" >'patch02c' <<'END_OF_FILE'
  33. X*** src/Old/Makefile.src    Wed Aug 16 12:10:18 1989
  34. X--- src/Makefile.src    Fri Aug 11 15:13:19 1989
  35. X***************
  36. X*** 5,11 ****
  37. X  # Makefile.3B2, Makefile.att, and Makefile.tos.
  38. X  # Set SYSTEM to one of:
  39. X  #    'Sysunix'    -- generic UNIX
  40. X! #    'Sysxenix'    -- 286 Xenix (386 Xenix can use Sysunix)
  41. X  #    'Sys3B2'    -- AT&T 3B2, 3B5, etc.
  42. X  #    'Sysatt'    -- AT&T UNIXPC, 7300, 3B1
  43. X  #    'Systos'    -- Atari
  44. X--- 5,11 ----
  45. X  # Makefile.3B2, Makefile.att, and Makefile.tos.
  46. X  # Set SYSTEM to one of:
  47. X  #    'Sysunix'    -- generic UNIX
  48. X! #    'Sysxenix'    -- 286 Xenix (386 Xenix should use Sysunix)
  49. X  #    'Sys3B2'    -- AT&T 3B2, 3B5, etc.
  50. X  #    'Sysatt'    -- AT&T UNIXPC, 7300, 3B1
  51. X  #    'Systos'    -- Atari
  52. X***************
  53. X*** 60,65 ****
  54. X--- 60,66 ----
  55. X  #          Spanic.o
  56. X  
  57. X  # on some systems the termcap library is in -ltermcap or -lcurses
  58. X+ # on 386 Xenix, the -ltermlib tputs() seems not to work; use -lcurses instead
  59. X  # Sysatt uses shared library in lieu of this option
  60. X  # TERMLIB = -ltermcap
  61. X  # TERMLIB = -lcurses
  62. X***************
  63. X*** 100,107 ****
  64. X  
  65. X  # all .c that are part of the main NetHack program and are not system specific
  66. X  
  67. X! CSOURCES = $(HACKCSRC) $(TARG)main.c $(TARG)main.c $(TARG)main.c makedefs.c panic.c
  68. X  
  69. X  HACKINCL = artifact.h attrib.h config.h coord.h decl.h edog.h epri.h eshk.h\
  70. X         extern.h flag.h func_tab.h global.h gold.h hack.h lev.h mfndpos.h\
  71. X         mkroom.h monattk.h mondata.h monflag.h monst.h monsym.h msdos.h\
  72. X--- 101,113 ----
  73. X  
  74. X  # all .c that are part of the main NetHack program and are not system specific
  75. X  
  76. X! # now the other .c files, with duplicates commented out
  77. X! MAKESRC = makedefs.c panic.c # monst.c objects.c
  78. X! SPLEVSRC = lev_comp.c lev_lex.c lev_main.c # alloc.c monst.c objects.c panic.c
  79. X! TARGSRC = $(TARG)main.c $(TARG)tty.c $(TARG)unix.c
  80. X  
  81. X+ CSOURCES = $(HACKCSRC) $(TARGSRC) $(MAKESRC) $(SPLEVSRC)
  82. X+ 
  83. X  HACKINCL = artifact.h attrib.h config.h coord.h decl.h edog.h epri.h eshk.h\
  84. X         extern.h flag.h func_tab.h global.h gold.h hack.h lev.h mfndpos.h\
  85. X         mkroom.h monattk.h mondata.h monflag.h monst.h monsym.h msdos.h\
  86. X***************
  87. X*** 110,117 ****
  88. X  
  89. X  # all .h files except date.h, onames.h, pm.h & trap.h which would cause
  90. X  # dependency loops if run through "make depend".
  91. X  
  92. X! HSOURCES = $(HACKINCL) date.h onames.h pm.h trap.h
  93. X  
  94. X  SOURCES = $(CSOURCES) $(HSOURCES)
  95. X  
  96. X--- 116,124 ----
  97. X  
  98. X  # all .h files except date.h, onames.h, pm.h & trap.h which would cause
  99. X  # dependency loops if run through "make depend".
  100. X+ # and lev_comp.h, a special level file
  101. X  
  102. X! HSOURCES = $(HACKINCL) date.h onames.h pm.h trap.h lev_comp.h
  103. X  
  104. X  SOURCES = $(CSOURCES) $(HSOURCES)
  105. X  
  106. X***************
  107. X*** 265,271 ****
  108. X  #    files, we kludge around this by making date.h dependent on hack.h,
  109. X  #    even though it doesn't include this file.
  110. X  #
  111. X! ../include/date.h:    $(CSOURCES) ../include/hack.h makedefs
  112. X      ./makedefs -v
  113. X  
  114. X  ../include/trap.h:    ../include/config.h makedefs
  115. X--- 272,278 ----
  116. X  #    files, we kludge around this by making date.h dependent on hack.h,
  117. X  #    even though it doesn't include this file.
  118. X  #
  119. X! ../include/date.h:    $(HACKCSRC) $(TARGSRC) ../include/hack.h makedefs
  120. X      ./makedefs -v
  121. X  
  122. X  ../include/trap.h:    ../include/config.h makedefs
  123. X***************
  124. X*** 300,306 ****
  125. X  # doweararm() versus dowearring().
  126. X  # _flsbuf comes from <stdio.h>, a bug in the system libraries.
  127. X      @echo lint -axbh -DLINT ...
  128. X!     @lint -axbh -I../include -DLINT $(HACKCSRC) $(TARG)main.c $(TARG)tty.c $(TARG)unix.c | sed '/_flsbuf/d'
  129. X  
  130. X  
  131. X  diff:
  132. X--- 307,313 ----
  133. X  # doweararm() versus dowearring().
  134. X  # _flsbuf comes from <stdio.h>, a bug in the system libraries.
  135. X      @echo lint -axbh -DLINT ...
  136. X!     @lint -axbh -I../include -DLINT $(HACKCSRC) $(TARGSRC) | sed '/_flsbuf/d'
  137. X  
  138. X  
  139. X  diff:
  140. X*** src/Old/apply.c    Wed Aug 16 12:11:01 1989
  141. X--- src/apply.c    Tue Aug 15 22:58:25 1989
  142. X***************
  143. X*** 24,31 ****
  144. X  
  145. X      if(sym) {
  146. X          Tmp_at2(-1, sym);    /* open call */
  147. X! #ifdef MSDOSCOLOR
  148. X!         Tmp_at2(-3, (int)AT_WHITE);
  149. X  #endif
  150. X      }
  151. X      while(range--) {
  152. X--- 24,31 ----
  153. X  
  154. X      if(sym) {
  155. X          Tmp_at2(-1, sym);    /* open call */
  156. X! #ifdef TEXTCOLOR
  157. X!         Tmp_at2(-3, WHITE);
  158. X  #endif
  159. X      }
  160. X      while(range--) {
  161. X***************
  162. X*** 305,312 ****
  163. X              pline("This %s is already leashed!", lmonnam(mtmp)+4);
  164. X              return;
  165. X          }
  166. X!         You("slip the leash around your %s.",
  167. X!                 mtmp->data->mname);
  168. X          mtmp->mleashed = 1;
  169. X          obj->leashmon = (int)mtmp->m_id;
  170. X          if(mtmp->msleep)  mtmp->msleep = 0;
  171. X--- 305,311 ----
  172. X              pline("This %s is already leashed!", lmonnam(mtmp)+4);
  173. X              return;
  174. X          }
  175. X!         You("slip the leash around your %s.", lmonnam(mtmp)+4);
  176. X          mtmp->mleashed = 1;
  177. X          obj->leashmon = (int)mtmp->m_id;
  178. X          if(mtmp->msleep)  mtmp->msleep = 0;
  179. X***************
  180. X*** 490,496 ****
  181. X              if (break_statue(obj))
  182. X                  digtxt = "The statue shatters.";
  183. X              else
  184. X!     digtxt = "Instead of shattering, the statue suddenly comes alive!";
  185. X          } else if(!lev->typ || lev->typ == SCORR) {
  186. X              lev->typ = CORR;
  187. X              digtxt = "You succeeded in cutting away some rock.";
  188. X--- 489,498 ----
  189. X              if (break_statue(obj))
  190. X                  digtxt = "The statue shatters.";
  191. X              else
  192. X!                 /* it was a statue trap; break_statue()
  193. X!                  * printed a message and updated the screen
  194. X!                  */
  195. X!                 digtxt = NULL;
  196. X          } else if(!lev->typ || lev->typ == SCORR) {
  197. X              lev->typ = CORR;
  198. X              digtxt = "You succeeded in cutting away some rock.";
  199. X***************
  200. X*** 518,524 ****
  201. X            digtxt = "Now what exactly was it that you were digging in?";
  202. X          mnewsym(dpx, dpy);
  203. X          prl(dpx, dpy);
  204. X!         pline(digtxt);        /* after mnewsym & prl */
  205. X          if(IS_DOOR(lev->typ) && (lev->doormask & D_TRAPPED)) {
  206. X              b_trapped("door");
  207. X              lev->doormask = D_NODOOR;
  208. X--- 520,526 ----
  209. X            digtxt = "Now what exactly was it that you were digging in?";
  210. X          mnewsym(dpx, dpy);
  211. X          prl(dpx, dpy);
  212. X!         if (digtxt) pline(digtxt);    /* after mnewsym & prl */
  213. X          if(IS_DOOR(lev->typ) && (lev->doormask & D_TRAPPED)) {
  214. X              b_trapped("door");
  215. X              lev->doormask = D_NODOOR;
  216. X***************
  217. X*** 747,761 ****
  218. X  use_mirror(obj)
  219. X  struct obj *obj;
  220. X  {
  221. X!      register struct monst *mtmp;
  222. X!      register char mlet;
  223. X  
  224. X      if(!getdir(1)){        /* ask: in what direction? */
  225. X          flags.move = multi = 0;
  226. X          return;
  227. X      }
  228. X      if(!u.dx && !u.dy && !u.dz) {
  229. X!         if(!Blind && !Invisible)
  230. X  #ifdef POLYSELF
  231. X              if(u.umonnum == PM_FLOATING_EYE) {
  232. X              pline("Yikes!  You've frozen yourself!");
  233. X--- 749,768 ----
  234. X  use_mirror(obj)
  235. X  struct obj *obj;
  236. X  {
  237. X!     register struct monst *mtmp;
  238. X!     register char mlet;
  239. X  
  240. X      if(!getdir(1)){        /* ask: in what direction? */
  241. X          flags.move = multi = 0;
  242. X          return;
  243. X      }
  244. X+     if(obj->cursed && !rn2(2)) {
  245. X+         if (!Blind)
  246. X+             pline("The mirror gets foggy and doesn't reflect!");
  247. X+         return;
  248. X+     }
  249. X      if(!u.dx && !u.dy && !u.dz) {
  250. X!         if(!Blind && !Invisible) {
  251. X  #ifdef POLYSELF
  252. X              if(u.umonnum == PM_FLOATING_EYE) {
  253. X              pline("Yikes!  You've frozen yourself!");
  254. X***************
  255. X*** 788,794 ****
  256. X                  ACURR(A_CHA) > 14 ?
  257. X                  (poly_gender()==1 ? "beautiful" : "handsome") :
  258. X                  "ugly");
  259. X!         else {
  260. X          if (rn2(4-u.uluck/3) || !HTelepat ||
  261. X              (u.ukilled_medusa
  262. X  #ifdef HARD
  263. X--- 795,801 ----
  264. X                  ACURR(A_CHA) > 14 ?
  265. X                  (poly_gender()==1 ? "beautiful" : "handsome") :
  266. X                  "ugly");
  267. X!         } else {
  268. X          if (rn2(4-u.uluck/3) || !HTelepat ||
  269. X              (u.ukilled_medusa
  270. X  #ifdef HARD
  271. X***************
  272. X*** 838,898 ****
  273. X              (u.dz > 0) ? "floor" : "ceiling");
  274. X          return;
  275. X      }
  276. X!     if((mtmp = bchit(u.dx, u.dy, COLNO, 0)) && haseyes(mtmp->data)) {
  277. X!         mlet = mtmp->data->mlet;
  278. X!         if(mtmp->msleep) {
  279. X!         if (!Blind)
  280. X              pline ("%s is tired and doesn't look at your mirror.",
  281. X                  Monnam(mtmp));
  282. X          mtmp->msleep = 0;
  283. X!         } else if (!mtmp->mcansee) {
  284. X          if (!Blind)
  285. X              pline("%s can't see anything at the moment.", Monnam(mtmp));
  286. X!         } else if (mtmp->minvis || mlet == S_VAMPIRE ||
  287. X!                     mlet == S_DEMON || mlet == S_GHOST) {
  288. X          if (!Blind)
  289. X             pline ("%s doesn't seem to reflect anything.", Monnam(mtmp));
  290. X!         } else if (!mtmp->mcan) {
  291. X!         /* some monsters do special things */
  292. X!         if(obj->cursed && !rn2(2)) {
  293. X!             if (!Blind)
  294. X!             pline("The mirror gets foggy and doesn't reflect!");
  295. X!             return;
  296. X!         } else if(mtmp->data == &mons[PM_MEDUSA]) {
  297. X!             if (!Blind)
  298. X              pline("%s is turned to stone!", Monnam(mtmp));
  299. X!             stoned = TRUE;
  300. X!             killed(mtmp);
  301. X!         } else if(mtmp->data == &mons[PM_FLOATING_EYE]) {
  302. X!             if (!Blind)
  303. X              pline("%s is frozen by its reflection.",Monnam(mtmp));
  304. X!             mtmp->mfroz = 1;
  305. X!         } else if(mtmp->data == &mons[PM_UMBER_HULK]) {
  306. X!             if (!Blind)
  307. X              pline ("%s has confused itself!", Monnam(mtmp));
  308. X!                 mtmp->mconf = 1;
  309. X!         } else if(mlet == S_NYMPH
  310. X  #ifdef HARD
  311. X                || mtmp->data==&mons[PM_SUCCUBUS]
  312. X  #endif
  313. X!               ) {
  314. X!             if (!Blind) {
  315. X!                   pline ("%s looks beautiful in your mirror.",Monnam(mtmp));
  316. X!                   pline ("She decides to take it!");
  317. X!             } else pline ("It steals your mirror!");
  318. X!                 freeinv(obj);
  319. X!                 mpickobj(mtmp,obj);
  320. X!                 rloc(mtmp);
  321. X!         }
  322. X!         } else if (mlet != S_UNICORN && !humanoid(mtmp->data) && rn2(5)) {
  323. X          if (!Blind)
  324. X!         pline ("%s is frightened by its reflection.", Monnam(mtmp));
  325. X          mtmp->mflee = 1;
  326. X          mtmp->mfleetim += d(2,4);
  327. X!         } else if (!Blind)
  328. X!         pline("%s doesn't seem to mind %s reflection.", Monnam(mtmp),
  329. X!               (is_female(mtmp) ? "her" :
  330. X!                is_human(mtmp->data) ? "his" : "its"));
  331. X      }
  332. X  }/* use_mirror */
  333. X  
  334. X--- 845,916 ----
  335. X              (u.dz > 0) ? "floor" : "ceiling");
  336. X          return;
  337. X      }
  338. X!     if(!(mtmp = bchit(u.dx, u.dy, COLNO, 0)) || !haseyes(mtmp->data))
  339. X!         return;
  340. X! 
  341. X!     mlet = mtmp->data->mlet;
  342. X!     if(mtmp->msleep) {
  343. X!         if(!Blind)
  344. X              pline ("%s is tired and doesn't look at your mirror.",
  345. X                  Monnam(mtmp));
  346. X          mtmp->msleep = 0;
  347. X!     } else if (!mtmp->mcansee) {
  348. X          if (!Blind)
  349. X              pline("%s can't see anything at the moment.", Monnam(mtmp));
  350. X!     /* some monsters do special things */
  351. X!     } else if (mlet == S_VAMPIRE || mlet == S_DEMON || mlet == S_GHOST ||
  352. X!           (mtmp->minvis && !perceives(mtmp->data) && !See_invisible)) {
  353. X          if (!Blind)
  354. X             pline ("%s doesn't seem to reflect anything.", Monnam(mtmp));
  355. X!     } else if(!mtmp->mcan && mtmp->data == &mons[PM_MEDUSA]) {
  356. X!         if (!Blind)
  357. X              pline("%s is turned to stone!", Monnam(mtmp));
  358. X!         stoned = TRUE;
  359. X!         killed(mtmp);
  360. X!     } else if(!mtmp->mcan && !mtmp->minvis &&
  361. X!                     mtmp->data == &mons[PM_FLOATING_EYE]) {
  362. X!     /* Note: floating eyes cannot use their abilities while invisible,
  363. X!      * but medusas and umber hulks can.
  364. X!      */
  365. X!         if (!Blind)
  366. X              pline("%s is frozen by its reflection.",Monnam(mtmp));
  367. X!         mtmp->mfroz = 1;
  368. X!     } else if(!mtmp->mcan && mtmp->data == &mons[PM_UMBER_HULK]) {
  369. X!         if (!Blind)
  370. X              pline ("%s has confused itself!", Monnam(mtmp));
  371. X!             mtmp->mconf = 1;
  372. X!     } else if(!mtmp->mcan && !mtmp->minvis && (mlet == S_NYMPH
  373. X  #ifdef HARD
  374. X                || mtmp->data==&mons[PM_SUCCUBUS]
  375. X  #endif
  376. X!               )) {
  377. X!         if (!Blind) {
  378. X!                 pline ("%s looks beautiful in your mirror.",Monnam(mtmp));
  379. X!                 pline ("She decides to take it!");
  380. X!         } else pline ("It steals your mirror!");
  381. X!             freeinv(obj);
  382. X!             mpickobj(mtmp,obj);
  383. X!             rloc(mtmp);
  384. X!     } else if (mlet != S_UNICORN && !humanoid(mtmp->data) && 
  385. X!             (!mtmp->minvis || perceives(mtmp->data)) && rn2(5)) {
  386. X          if (!Blind)
  387. X!             pline ("%s is frightened by its reflection%s.",
  388. X!                 Monnam(mtmp), (mtmp->minvis && !See_invisible
  389. X!                     && !Telepat) ?
  390. X!                 ", though you see nothing" : "");
  391. X          mtmp->mflee = 1;
  392. X          mtmp->mfleetim += d(2,4);
  393. X!     } else if (!Blind) {
  394. X!         if (mtmp->minvis && !See_invisible)
  395. X!             pline("%s doesn't seem to reflect anything.",
  396. X!             Monnam(mtmp));
  397. X!         else if (mtmp->minvis && !perceives(mtmp->data))
  398. X!             pline("%s doesn't seem to be aware of its reflection.",
  399. X!             Monnam(mtmp));
  400. X!         else
  401. X!             pline("%s doesn't seem to mind %s reflection.",
  402. X!             Monnam(mtmp), (is_female(mtmp) ? "her" :
  403. X!                 is_human(mtmp->data) ? "his" : "its"));
  404. X      }
  405. X  }/* use_mirror */
  406. X  
  407. X***************
  408. X*** 1048,1053 ****
  409. X--- 1066,1073 ----
  410. X          return 0;
  411. X      }
  412. X      pline("Where do you want to jump?");
  413. X+     cc.x = u.ux;
  414. X+     cc.y = u.uy;
  415. X      getpos(&cc, 1, "the desired position");
  416. X      if (dist(cc.x, cc.y) > 9) {
  417. X          pline("Too far!");
  418. X***************
  419. X*** 1095,1101 ****
  420. X  pline("Tinning a cockatrice corpse without gloves was not a very wise move...");
  421. X          You("turn to stone...");
  422. X          killer = "unwise tinning decision";
  423. X!         done("stoned");
  424. X      }
  425. X      can = mksobj(TIN,FALSE);
  426. X      can->corpsenm = corpse->corpsenm;
  427. X--- 1115,1121 ----
  428. X  pline("Tinning a cockatrice corpse without gloves was not a very wise move...");
  429. X          You("turn to stone...");
  430. X          killer = "unwise tinning decision";
  431. X!         done(STONING);
  432. X      }
  433. X      can = mksobj(TIN,FALSE);
  434. X      can->corpsenm = corpse->corpsenm;
  435. X*** src/Old/bones.c    Wed Aug 16 12:12:22 1989
  436. X--- src/bones.c    Tue Aug 15 21:55:10 1989
  437. X***************
  438. X*** 42,47 ****
  439. X--- 42,50 ----
  440. X  {
  441. X      return (lev == medusa_level ||
  442. X          lev == wiz_level
  443. X+ #ifdef REINCARNATION
  444. X+         || lev == rogue_level
  445. X+ #endif
  446. X  #ifdef STRONGHOLD
  447. X          || lev == stronghold_level ||
  448. X          (lev >= tower_level && lev <= tower_level+2)
  449. X***************
  450. X*** 240,246 ****
  451. X--- 243,251 ----
  452. X      savefruitchn(fd);
  453. X  #endif
  454. X      savelev(fd, dlevel, COUNT);
  455. X+ #ifdef ZEROCOMP
  456. X      bflush(fd);
  457. X+ #endif
  458. X      if (bytes_counted > freediskspace(bones)) {    /* not enough room */
  459. X  #ifdef WIZARD
  460. X          if (wizard)
  461. X*** src/Old/cmd.c    Wed Aug 16 12:12:44 1989
  462. X--- src/cmd.c    Tue Aug 15 22:58:59 1989
  463. X***************
  464. X*** 90,95 ****
  465. X--- 90,115 ----
  466. X      return multi > 0;
  467. X  }
  468. X  
  469. X+ /* If you have moved since initially setting some occupations, they
  470. X+  * now shouldn't be able to restart.
  471. X+  *
  472. X+  * The basic rule is that if you are carrying it, you can continue
  473. X+  * since it is with you.  If you are acting on something at a distance,
  474. X+  * your orientation to it must have changed when you moved.
  475. X+  *
  476. X+  * The exception to this is taking off items, since they can be taken
  477. X+  * off in a number of ways in the intervening time, screwing up ordering.
  478. X+  *
  479. X+  *    Currently:    Take off all armor.
  480. X+  *            Picking Locks / Forcing Chests.
  481. X+  */
  482. X+ void
  483. X+ reset_occupations() {
  484. X+ 
  485. X+     reset_remarm();
  486. X+     reset_pick();
  487. X+ }
  488. X+ 
  489. X  /* If a time is given, use it to timeout this function, otherwise the
  490. X   * function times out by its own means.
  491. X   */
  492. X***************
  493. X*** 417,443 ****
  494. X  }
  495. X  #endif /* WIZARD || EXPLORE_MODE */
  496. X  
  497. X  const struct func_tab cmdlist[]={
  498. X!     {'\004', /* ^D */ dokick},    /* "D" is for door!...? */
  499. X  #ifdef WIZARD
  500. X!     {'\005', /* ^E */ wiz_detect},
  501. X!     {'\006', /* ^F */ wiz_map},
  502. X!     {'\007', /* ^G */ wiz_genesis},
  503. X!     {'\011', /* ^I */ wiz_identify},
  504. X!     {'\017', /* ^O */ wiz_where},
  505. X  #endif
  506. X!     {'\020', /* ^P */ doredotopl},
  507. X!     {'\022', /* ^R */ doredraw},
  508. X!     {'\024', /* ^T */ dotele},
  509. X  #ifdef WIZARD
  510. X!     {'\026', /* ^V */ wiz_level_tele},
  511. X!     {'\027', /* ^W */ wiz_wish},
  512. X  #endif
  513. X  #if defined(WIZARD) || defined(EXPLORE_MODE)
  514. X!     {'\030', /* ^X */ wiz_attributes},
  515. X  #endif
  516. X  #ifdef SUSPEND
  517. X!     {'\032', /* ^Z */ dosuspend},
  518. X  #endif
  519. X      {'a', doapply},
  520. X      {'A', doddoremarm},
  521. X--- 437,465 ----
  522. X  }
  523. X  #endif /* WIZARD || EXPLORE_MODE */
  524. X  
  525. X+ #define M(c)        (0x80 | (c))
  526. X+ #define C(c)        (0x1f & (c))
  527. X  const struct func_tab cmdlist[]={
  528. X!     {C('d'), dokick},    /* "D" is for door!...? */
  529. X  #ifdef WIZARD
  530. X!     {C('e'), wiz_detect},
  531. X!     {C('f'), wiz_map},
  532. X!     {C('g'), wiz_genesis},
  533. X!     {C('i'), wiz_identify},
  534. X!     {C('o'), wiz_where},
  535. X  #endif
  536. X!     {C('p'), doredotopl},
  537. X!     {C('r'), doredraw},
  538. X!     {C('t'), dotele},
  539. X  #ifdef WIZARD
  540. X!     {C('v'), wiz_level_tele},
  541. X!     {C('w'), wiz_wish},
  542. X  #endif
  543. X  #if defined(WIZARD) || defined(EXPLORE_MODE)
  544. X!     {C('x'), wiz_attributes},
  545. X  #endif
  546. X  #ifdef SUSPEND
  547. X!     {C('z'), dosuspend},
  548. X  #endif
  549. X      {'a', doapply},
  550. X      {'A', doddoremarm},
  551. X***************
  552. X*** 444,451 ****
  553. X--- 466,475 ----
  554. X  /*    'b', 'B' : go sw */
  555. X      {'c', doclose},
  556. X      {'C', do_mname},
  557. X+     {M('c'), dotalk},
  558. X      {'d', dodrop},
  559. X      {'D', doddrop},
  560. X+     {M('d'), dodip},
  561. X      {'e', doeat},
  562. X      {'E', doengrave},
  563. X  /* Soon to be
  564. X***************
  565. X*** 452,457 ****
  566. X--- 476,482 ----
  567. X      {'f', dofight, "fighting"},
  568. X      {'F', doFight, "fighting"},
  569. X   */
  570. X+     {M('f'), doforce},
  571. X  /*    'g', 'G' : multiple go */
  572. X  /*    'h', 'H' : go west */
  573. X      {'h', dohelp}, /* if number_pad is set */
  574. X***************
  575. X*** 459,486 ****
  576. X--- 484,528 ----
  577. X      {'I', dotypeinv},        /* Robert Viduya */
  578. X  /*    'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N' : move commands */
  579. X      {'j', dojump}, /* if number_pad is on */
  580. X+     {M('j'), dojump},
  581. X      {'k', dokick}, /* if number_pad is on */
  582. X      {'l', doloot}, /* if number_pad is on */
  583. X+     {M('l'), doloot},
  584. X  /*    'n' prefixes a count if number_pad is on */
  585. X+ #ifdef POLYSELF
  586. X+     {M('m'), domonability},
  587. X+ #endif /* POLYSELF */
  588. X      {'N', ddocall}, /* if number_pad is on */
  589. X+     {M('N'), ddocall},
  590. X      {'o', doopen},
  591. X      {'O', doset},
  592. X+ #ifdef THEOLOGY
  593. X+     {M('o'), dosacrifice},
  594. X+ #endif /* THEOLOGY */
  595. X      {'p', dopay},
  596. X      {'P', doputon},
  597. X+ #ifdef THEOLOGY
  598. X+     {M('p'), dopray},
  599. X+ #endif /* THEOLOGY */
  600. X      {'q', dodrink},
  601. X      {'Q', done2},
  602. X      {'r', doread},
  603. X      {'R', doremring},
  604. X+     {M('r'), dorub},
  605. X      {'s', dosearch, "searching"},
  606. X      {'S', dosave},
  607. X+     {M('s'), dosit},
  608. X      {'t', dothrow},
  609. X      {'T', dotakeoff},
  610. X+     {M('t'), doturn},
  611. X  /*    'u', 'U' : go ne */
  612. X      {'u', dountrap}, /* if number_pad is on */
  613. X+     {M('u'), dountrap},
  614. X      {'v', doversion},
  615. X      {'V', dohistory},
  616. X      {'w', dowield},
  617. X      {'W', dowear},
  618. X+     {M('w'), dowipe},
  619. X  #ifdef SPELLS
  620. X      {'x', dovspell},            /* Mike Stephenson */
  621. X  #endif
  622. X***************
  623. X*** 516,521 ****
  624. X--- 558,565 ----
  625. X      {'#', doextcmd},
  626. X      {0,0,0}
  627. X  };
  628. X+ #undef M
  629. X+ #undef C
  630. X  
  631. X  const struct ext_func_tab extcmdlist[] = {
  632. X      "chat", "talk to someone", dotalk,    /* converse? */
  633. X***************
  634. X*** 618,624 ****
  635. X          goto rush;
  636. X      }
  637. X      while(tlist->f_char) {
  638. X!         if(*cmd == tlist->f_char){
  639. X              /* Special case of *cmd == ' ' handled here */
  640. X              if (*cmd == ' ' && flags.no_rest_on_space)
  641. X                  break;
  642. X--- 662,668 ----
  643. X          goto rush;
  644. X      }
  645. X      while(tlist->f_char) {
  646. X!         if((*cmd & 0xff) == (tlist->f_char & 0xff)){
  647. X              /* Special case of *cmd == ' ' handled here */
  648. X              if (*cmd == ' ' && flags.no_rest_on_space)
  649. X                  break;
  650. X***************
  651. X*** 642,647 ****
  652. X--- 686,696 ----
  653. X        while(*cmd && cp-expcmd < sizeof(expcmd)-2) {
  654. X          if(*cmd >= 040 && *cmd < 0177)
  655. X              *cp++ = *cmd++;
  656. X+         else if (*cmd & 0200) {
  657. X+             *cp++ = 'M';
  658. X+             *cp++ = '-';
  659. X+             *cp++ = *cmd++ &=~ 0200;
  660. X+         }
  661. X          else {
  662. X              *cp++ = '^';
  663. X              *cp++ = *cmd++ ^ 0100;
  664. X*** src/Old/dbridge.c    Wed Aug 16 12:13:20 1989
  665. X--- src/dbridge.c    Tue Aug 15 20:34:01 1989
  666. X***************
  667. X*** 62,76 ****
  668. X      struct rm *lev;
  669. X  
  670. X      lev = &levl[x][y];
  671. X!     if ( lev->typ == VWALL || lev->typ == DOOR) {
  672. X!         if (IS_DRAWBRIDGE(levl[x+1][y].typ) && 
  673. X!             (levl[x+1][y].drawbridgemask & DB_DIR) == DB_WEST)
  674. X              return (DB_WEST);
  675. X          if (IS_DRAWBRIDGE(levl[x-1][y].typ) && 
  676. X              (levl[x-1][y].drawbridgemask & DB_DIR) == DB_EAST)
  677. X              return (DB_EAST);
  678. X!     }
  679. X!     if ( lev->typ == HWALL || lev->typ == DOOR) {
  680. X          if (IS_DRAWBRIDGE(levl[x][y-1].typ) && 
  681. X              (levl[x][y-1].drawbridgemask & DB_DIR) == DB_SOUTH)
  682. X              return (DB_SOUTH);
  683. X--- 62,80 ----
  684. X      struct rm *lev;
  685. X  
  686. X      lev = &levl[x][y];
  687. X!     if (lev->typ != DOOR && !(lev->diggable & W_GATEWAY))
  688. X!         return (-1);
  689. X!     switch (lev->typ) {
  690. X!         case DOOR:
  691. X!         case VWALL:
  692. X!         if (IS_DRAWBRIDGE(levl[x+1][y].typ) &&
  693. X!              (levl[x+1][y].drawbridgemask & DB_DIR) == DB_WEST)
  694. X              return (DB_WEST);
  695. X          if (IS_DRAWBRIDGE(levl[x-1][y].typ) && 
  696. X              (levl[x-1][y].drawbridgemask & DB_DIR) == DB_EAST)
  697. X              return (DB_EAST);
  698. X!         if (lev->typ == VWALL) break;
  699. X!         case HWALL:
  700. X          if (IS_DRAWBRIDGE(levl[x][y-1].typ) && 
  701. X              (levl[x][y-1].drawbridgemask & DB_DIR) == DB_SOUTH)
  702. X              return (DB_SOUTH);
  703. X***************
  704. X*** 252,258 ****
  705. X  
  706. X          You("are crushed by a falling portcullis.");
  707. X          killer = "closing drawbridge";
  708. X!         done("died");
  709. X          /* So, you didn't die */
  710. X          pline("A %s force teleports you away...",
  711. X                Hallucination ? "normal" : "strange");
  712. X--- 256,262 ----
  713. X  
  714. X          You("are crushed by a falling portcullis.");
  715. X          killer = "closing drawbridge";
  716. X!         done(CRUSHING);
  717. X          /* So, you didn't die */
  718. X          pline("A %s force teleports you away...",
  719. X                Hallucination ? "normal" : "strange");
  720. X***************
  721. X*** 295,301 ****
  722. X              newsym(x2,y2);
  723. X          You("are hit by the descending drawbridge!");
  724. X          killer = "descending drawbridge";
  725. X!         done("died");
  726. X      }
  727. X      redosym(x,y);
  728. X      redosym(x2,y2);
  729. X--- 299,305 ----
  730. X              newsym(x2,y2);
  731. X          You("are hit by the descending drawbridge!");
  732. X          killer = "descending drawbridge";
  733. X!         done(CRUSHING);
  734. X      }
  735. X      redosym(x,y);
  736. X      redosym(x2,y2);
  737. X***************
  738. X*** 354,360 ****
  739. X  
  740. X          You("are crushed by a falling portcullis.");
  741. X          killer = "collapsing drawbridge";
  742. X!         done("died");
  743. X          /* So, you didn't die */
  744. X          pline("A %s force teleports you away...",
  745. X                Hallucination ? "normal" : "strange");
  746. X--- 358,364 ----
  747. X  
  748. X          You("are crushed by a falling portcullis.");
  749. X          killer = "collapsing drawbridge";
  750. X!         done(CRUSHING);
  751. X          /* So, you didn't die */
  752. X          pline("A %s force teleports you away...",
  753. X                Hallucination ? "normal" : "strange");
  754. X*** src/Old/decl.c    Wed Aug 16 12:13:39 1989
  755. X--- src/decl.c    Fri Aug 11 17:05:27 1989
  756. X***************
  757. X*** 71,78 ****
  758. X      /* set up in termcap.c */
  759. X  int CO = 0, LI = 0;    /* set up in termcap.c: usually COLNO and ROWNO+3 */
  760. X  
  761. X! #ifdef MSDOSCOLOR
  762. X! char *HI_RED, *HI_YELLOW, *HI_GREEN, *HI_BLUE, *HI_WHITE; /* termcap.c */
  763. X  #endif
  764. X  
  765. X  #ifdef MSDOS
  766. X--- 71,78 ----
  767. X      /* set up in termcap.c */
  768. X  int CO = 0, LI = 0;    /* set up in termcap.c: usually COLNO and ROWNO+3 */
  769. X  
  770. X! #ifdef TEXTCOLOR
  771. X! char *HI_COLOR[8];        /* terminal escapes for the various colors */
  772. X  #endif
  773. X  
  774. X  #ifdef MSDOS
  775. X*** src/Old/demon.c    Wed Aug 16 12:13:54 1989
  776. X--- src/demon.c    Tue Aug 15 22:05:37 1989
  777. X***************
  778. X*** 10,15 ****
  779. X--- 10,16 ----
  780. X  {
  781. X      register int dtype, cnt = 0;
  782. X  
  783. X+ #ifdef HARD
  784. X      if(is_dprince(ptr) || (ptr == &mons[PM_WIZARD_OF_YENDOR])) {
  785. X  
  786. X          dtype = (!rn2(20)) ? dprince() : (!rn2(4)) ? dlord() : ndemon();
  787. X***************
  788. X*** 27,32 ****
  789. X--- 28,37 ----
  790. X      }
  791. X  
  792. X      if(!dtype) return;
  793. X+ #else
  794. X+     dtype = PM_DEMON;
  795. X+     cnt = 1;
  796. X+ #endif
  797. X  
  798. X      while(cnt > 0) {
  799. X  
  800. X***************
  801. X*** 100,110 ****
  802. X  }
  803. X  #endif
  804. X  
  805. X! #if defined(HARD) || (defined(ALTARS) && defined(SOUNDS))
  806. X  long
  807. X  bribe(mtmp)
  808. X! 
  809. X!     struct monst *mtmp;
  810. X  {
  811. X      char buf[80];
  812. X      long offer;
  813. X--- 105,114 ----
  814. X  }
  815. X  #endif
  816. X  
  817. X! #if defined(HARD) || (defined(ALTARS) && defined(THEOLOGY))
  818. X  long
  819. X  bribe(mtmp)
  820. X! struct monst *mtmp;
  821. X  {
  822. X      char buf[80];
  823. X      long offer;
  824. X***************
  825. X*** 118,127 ****
  826. X           You("try to shortchange %s, but fumble.", 
  827. X               x_monnam(mtmp, 0));
  828. X           offer = 0L;
  829. X       } else if(offer >= u.ugold) {
  830. X          You("give %s all your gold.", x_monnam(mtmp, 0));
  831. X          offer = u.ugold;
  832. X!     } else You("give %s %ld Zorkmids.", x_monnam(mtmp, 0), offer);
  833. X  
  834. X      u.ugold -= offer;
  835. X      return(offer);
  836. X--- 122,134 ----
  837. X           You("try to shortchange %s, but fumble.", 
  838. X               x_monnam(mtmp, 0));
  839. X           offer = 0L;
  840. X+      } else if(offer == 0L) {
  841. X+         You("refuse.");
  842. X       } else if(offer >= u.ugold) {
  843. X          You("give %s all your gold.", x_monnam(mtmp, 0));
  844. X          offer = u.ugold;
  845. X!     } else You("give %s %ld Zorkmid%s.", x_monnam(mtmp, 0), offer,
  846. X!            offer == 1 ? "" : "s");
  847. X  
  848. X      u.ugold -= offer;
  849. X      return(offer);
  850. X***************
  851. X*** 131,166 ****
  852. X  int
  853. X  dprince() {
  854. X  #ifdef HARD
  855. X!     int    tryct;
  856. X!     struct    permonst *ptr;
  857. X! 
  858. X!     for(tryct = 0; tryct < 20; tryct++)
  859. X!         if(is_dprince((ptr = mkclass(S_DEMON))))
  860. X!         return(monsndx(ptr));
  861. X  
  862. X  #endif
  863. X-     return(dlord());
  864. X  }
  865. X  
  866. X  int
  867. X  dlord() {
  868. X  #ifdef HARD
  869. X!     int    tryct;
  870. X!     struct    permonst *ptr;
  871. X! 
  872. X!     for(tryct = 0; tryct < 20; tryct++)
  873. X!         if(is_dlord((ptr = mkclass(S_DEMON))))
  874. X!         return(monsndx(ptr));
  875. X  
  876. X  #endif
  877. X-     return(ndemon());
  878. X  }
  879. X  
  880. X  int
  881. X  ndemon() {
  882. X! #ifndef HARD
  883. X!     return(PM_DEMON);
  884. X! #else
  885. X      int    tryct;
  886. X      struct    permonst *ptr;
  887. X  
  888. X--- 138,175 ----
  889. X  int
  890. X  dprince() {
  891. X  #ifdef HARD
  892. X!     int    tryct, pm;
  893. X  
  894. X+     for(tryct = 0; tryct < 20; tryct++) {
  895. X+         pm = rn1(PM_DEMOGORGON + 1 - PM_ORCUS, PM_ORCUS);
  896. X+         if(!(mons[pm].geno & G_GENOD))
  897. X+         return(pm);
  898. X+     }
  899. X+     return(dlord());    /* approximate */
  900. X+ #else
  901. X+     return(PM_DEMON);
  902. X  #endif
  903. X  }
  904. X  
  905. X  int
  906. X  dlord() {
  907. X  #ifdef HARD
  908. X!     int    tryct, pm;
  909. X  
  910. X+     for(tryct = 0; tryct < 20; tryct++) {
  911. X+         pm = rn1(PM_YEENOGHU + 1 - PM_JUIBLEX, PM_JUIBLEX);
  912. X+         if(!(mons[pm].geno & G_GENOD))
  913. X+         return(pm);
  914. X+     }
  915. X+     return(ndemon());    /* approximate */
  916. X+ #else
  917. X+     return(PM_DEMON);
  918. X  #endif
  919. X  }
  920. X  
  921. X  int
  922. X  ndemon() {
  923. X! #ifdef HARD
  924. X      int    tryct;
  925. X      struct    permonst *ptr;
  926. X  
  927. X***************
  928. X*** 169,173 ****
  929. X--- 178,184 ----
  930. X          return(monsndx(ptr));
  931. X  
  932. X      return(0);
  933. X+ #else
  934. X+     return(PM_DEMON);
  935. X  #endif
  936. X  }
  937. X*** src/Old/do.c    Fri Jul 28 01:58:01 1989
  938. X--- src/do.c    Wed Aug 16 22:13:57 1989
  939. X***************
  940. X*** 285,291
  941. X          /* turn water into [(un)holy] water */
  942. X          if (obj->otyp == POT_WATER) {
  943. X              obj->blessed = !!(levl[u.ux][u.uy].altarmask & A_LAW);
  944. X!             obj->cursed = !!(levl[u.ux][u.uy].altarmask & A_CHAOS);
  945. X          }
  946. X          doaltarobj(obj);    /* set bknown */
  947. X      } else
  948. X
  949. X--- 285,292 -----
  950. X          /* turn water into [(un)holy] water */
  951. X          if (obj->otyp == POT_WATER) {
  952. X              obj->blessed = !!(levl[u.ux][u.uy].altarmask & A_LAW);
  953. X!             obj->cursed =
  954. X!                 !(levl[u.ux][u.uy].altarmask & (A_LAW | A_NEUTRAL));
  955. X          }
  956. X          doaltarobj(obj);    /* set bknown */
  957. X      } else
  958. X***************
  959. X*** 342,347
  960. X  dodown()
  961. X  {
  962. X      struct trap *trap = 0;
  963. X  #ifdef STRONGHOLD
  964. X      if((u.ux != xdnstair || u.uy != ydnstair) &&
  965. X         (!xdnladder || u.ux != xdnladder || u.uy != ydnladder)) {
  966. X
  967. X--- 343,350 -----
  968. X  dodown()
  969. X  {
  970. X      struct trap *trap = 0;
  971. X+ 
  972. X+     if((u.ux != xdnstair || u.uy != ydnstair)
  973. X  #ifdef STRONGHOLD
  974. X         && (!xdnladder || u.ux != xdnladder || u.uy != ydnladder)
  975. X  #endif
  976. X***************
  977. X*** 343,353
  978. X  {
  979. X      struct trap *trap = 0;
  980. X  #ifdef STRONGHOLD
  981. X!     if((u.ux != xdnstair || u.uy != ydnstair) &&
  982. X!        (!xdnladder || u.ux != xdnladder || u.uy != ydnladder)) {
  983. X! #else
  984. X!     if(u.ux != xdnstair || u.uy != ydnstair) {
  985. X! #endif /* STRONGHOLD /**/
  986. X          if (!(trap = t_at(u.ux,u.uy)) || trap->ttyp != TRAPDOOR
  987. X                              || !trap->tseen) {
  988. X              You("can't go down here.");
  989. X
  990. X--- 346,354 -----
  991. X  
  992. X      if((u.ux != xdnstair || u.uy != ydnstair)
  993. X  #ifdef STRONGHOLD
  994. X!        && (!xdnladder || u.ux != xdnladder || u.uy != ydnladder)
  995. X! #endif
  996. X!       ) {
  997. X          if (!(trap = t_at(u.ux,u.uy)) || trap->ttyp != TRAPDOOR
  998. X                              || !trap->tseen) {
  999. X              You("can't go down here.");
  1000. X***************
  1001. X*** 364,370
  1002. X                levl[u.ux][u.uy].typ == STAIRS ? "stairs" : "ladder");
  1003. X  #else
  1004. X          pline("You're floating high above the stairs.");
  1005. X! #endif /* STRONGHOLD /**/
  1006. X          return(0);
  1007. X      }
  1008. X  
  1009. X
  1010. X--- 365,371 -----
  1011. X                levl[u.ux][u.uy].typ == STAIRS ? "stairs" : "ladder");
  1012. X  #else
  1013. X          pline("You're floating high above the stairs.");
  1014. X! #endif
  1015. X          return(0);
  1016. X      }
  1017. X  
  1018. X***************
  1019. X*** 393,398
  1020. X  int
  1021. X  doup()
  1022. X  {
  1023. X  #ifdef STRONGHOLD
  1024. X      if((u.ux != xupstair || u.uy != yupstair) &&
  1025. X         (!xupladder || u.ux != xupladder || u.uy != yupladder)) {
  1026. X
  1027. X--- 394,400 -----
  1028. X  int
  1029. X  doup()
  1030. X  {
  1031. X+     if((u.ux != xupstair || u.uy != yupstair)
  1032. X  #ifdef STRONGHOLD
  1033. X         && (!xupladder || u.ux != xupladder || u.uy != yupladder)
  1034. X  #endif
  1035. X***************
  1036. X*** 394,404
  1037. X  doup()
  1038. X  {
  1039. X  #ifdef STRONGHOLD
  1040. X!     if((u.ux != xupstair || u.uy != yupstair) &&
  1041. X!        (!xupladder || u.ux != xupladder || u.uy != yupladder)) {
  1042. X! #else
  1043. X!     if(u.ux != xupstair || u.uy != yupstair) {
  1044. X! #endif /* STRONGHOLD /**/
  1045. X          You("can't go up here.");
  1046. X          return(0);
  1047. X      }
  1048. X
  1049. X--- 396,404 -----
  1050. X  {
  1051. X      if((u.ux != xupstair || u.uy != yupstair)
  1052. X  #ifdef STRONGHOLD
  1053. X!        && (!xupladder || u.ux != xupladder || u.uy != yupladder)
  1054. X! #endif
  1055. X!       ) {
  1056. X          You("can't go up here.");
  1057. X          return(0);
  1058. X      }
  1059. X***************
  1060. X*** 413,419
  1061. X                levl[u.ux][u.uy].typ == STAIRS ? "stairs" : "ladder");
  1062. X  #else
  1063. X          Your("load is too heavy to climb the stairs.");
  1064. X! #endif /* STRONGHOLD /**/
  1065. X          return(1);
  1066. X      }
  1067. X  
  1068. X
  1069. X--- 413,419 -----
  1070. X                levl[u.ux][u.uy].typ == STAIRS ? "stairs" : "ladder");
  1071. X  #else
  1072. X          Your("load is too heavy to climb the stairs.");
  1073. X! #endif
  1074. X          return(1);
  1075. X      }
  1076. X  
  1077. X***************
  1078. X*** 464,470
  1079. X          newlevel = ENDLEVEL;    /* Endgame Level !!! */
  1080. X          else
  1081. X  #endif
  1082. X!         done("escaped");    /* in fact < 0 is impossible */
  1083. X  
  1084. X  /*    If you have the amulet and are trying to get out of Hell, going
  1085. X   *    up a set of stairs sometimes does some very strange things!
  1086. X
  1087. X--- 464,470 -----
  1088. X          newlevel = ENDLEVEL;    /* Endgame Level !!! */
  1089. X          else
  1090. X  #endif
  1091. X!         done(ESCAPED);        /* in fact < 0 is impossible */
  1092. X  
  1093. X  /*    If you have the amulet and are trying to get out of Hell, going
  1094. X   *    up a set of stairs sometimes does some very strange things!
  1095. X***************
  1096. X*** 510,516
  1097. X          You("die...");
  1098. X          dlevel = maxdlevel = newlevel;
  1099. X          killer = "visit to hell";
  1100. X!         done("burned");
  1101. X          dlevel = newlevel = save_dlevel; /* in case they survive */
  1102. X          }
  1103. X      }
  1104. X
  1105. X--- 510,516 -----
  1106. X          You("die...");
  1107. X          dlevel = maxdlevel = newlevel;
  1108. X          killer = "visit to hell";
  1109. X!         done(BURNING);
  1110. X          dlevel = newlevel = save_dlevel; /* in case they survive */
  1111. X          }
  1112. X      }
  1113. X***************
  1114. X*** 615,621
  1115. X  #endif
  1116. X              pline("Cannot open %s .", lock);
  1117. X              pline("Probably someone removed it.");
  1118. X!             done("tricked");
  1119. X          }
  1120. X  #ifdef ZEROCOMP
  1121. X          minit();
  1122. X
  1123. X--- 615,621 -----
  1124. X  #endif
  1125. X              pline("Cannot open %s .", lock);
  1126. X              pline("Probably someone removed it.");
  1127. X!             done(TRICKED);
  1128. X          }
  1129. X  #ifdef ZEROCOMP
  1130. X          minit();
  1131. X***************
  1132. X*** 734,739
  1133. X      if (dlevel == 1 && u.uhave_amulet && flags.no_of_wizards == 0)
  1134. X          resurrect();
  1135. X  #endif
  1136. X  }
  1137. X  
  1138. X  int
  1139. X
  1140. X--- 734,740 -----
  1141. X      if (dlevel == 1 && u.uhave_amulet && flags.no_of_wizards == 0)
  1142. X          resurrect();
  1143. X  #endif
  1144. X+     is_maze_lev = !xdnstair;
  1145. X  }
  1146. X  
  1147. X  int
  1148. X*** src/Old/do_name.c    Wed Aug 16 12:14:43 1989
  1149. X--- src/do_name.c    Fri Aug 11 16:42:20 1989
  1150. X***************
  1151. X*** 34,41 ****
  1152. X      register int cx, cy, i, c;
  1153. X      char *sdp = flags.num_pad ? ndir : sdir;
  1154. X      if(flags.verbose) pline("(For instructions type a ?)");
  1155. X!     cx = u.ux;
  1156. X!     cy = u.uy;
  1157. X      curs(cx,cy+2);
  1158. X      while((c = readchar()) != '.'){
  1159. X          for(i=0; i<8; i++) if(sdp[i] == c){
  1160. X--- 34,41 ----
  1161. X      register int cx, cy, i, c;
  1162. X      char *sdp = flags.num_pad ? ndir : sdir;
  1163. X      if(flags.verbose) pline("(For instructions type a ?)");
  1164. X!     cx = cc->x;
  1165. X!     cy = cc->y;
  1166. X      curs(cx,cy+2);
  1167. X      while((c = readchar()) != '.'){
  1168. X          for(i=0; i<8; i++) if(sdp[i] == c){
  1169. X***************
  1170. X*** 46,58 ****
  1171. X              goto nxtc;
  1172. X          }
  1173. X          if(c == '?'){
  1174. X-             if(flags.verbose) {
  1175. X              pline("Use [%s] to move the cursor to %s.",
  1176. X                    flags.num_pad ? "2468" : "hjkl", goal);
  1177. X              pline("Type a . when you are at the right place.");
  1178. X-             }
  1179. X          } else {
  1180. X!             pline("Unknown direction: '%s' (%s).",
  1181. X                  visctrl(c),
  1182. X                  force ?
  1183. X                      flags.num_pad ? "use 2468 or ." :
  1184. X--- 46,57 ----
  1185. X              goto nxtc;
  1186. X          }
  1187. X          if(c == '?'){
  1188. X              pline("Use [%s] to move the cursor to %s.",
  1189. X                    flags.num_pad ? "2468" : "hjkl", goal);
  1190. X              pline("Type a . when you are at the right place.");
  1191. X          } else {
  1192. X!             if (!index(quitchars, c))
  1193. X!                 pline("Unknown direction: '%s' (%s).",
  1194. X                  visctrl(c),
  1195. X                  force ?
  1196. X                      flags.num_pad ? "use 2468 or ." :
  1197. X***************
  1198. X*** 80,85 ****
  1199. X--- 79,86 ----
  1200. X      register char *curr;
  1201. X      boolean blank;
  1202. X  
  1203. X+     cc.x = u.ux;
  1204. X+     cc.y = u.uy;
  1205. X      getpos(&cc, 0, "the monster you want to name");
  1206. X      cx = cc.x;
  1207. X      cy = cc.y;
  1208. X*** src/Old/do_wear.c    Wed Aug 16 12:15:06 1989
  1209. X--- src/do_wear.c    Tue Aug 15 18:49:53 1989
  1210. X***************
  1211. X*** 520,526 ****
  1212. X  #endif
  1213. X          break;
  1214. X      case RIN_SEE_INVISIBLE:
  1215. X!         if (Invisible && !Blind) {
  1216. X              newsym(u.ux,u.uy);
  1217. X              pline("Suddenly you can see yourself.");
  1218. X              makeknown(RIN_SEE_INVISIBLE);
  1219. X--- 520,530 ----
  1220. X  #endif
  1221. X          break;
  1222. X      case RIN_SEE_INVISIBLE:
  1223. X!         if (Invis && !oldprop
  1224. X! #ifdef POLYSELF
  1225. X!                 && !perceives(uasmon)
  1226. X! #endif
  1227. X!                             && !Blind) {
  1228. X              newsym(u.ux,u.uy);
  1229. X              pline("Suddenly you can see yourself.");
  1230. X              makeknown(RIN_SEE_INVISIBLE);
  1231. X***************
  1232. X*** 739,744 ****
  1233. X--- 743,749 ----
  1234. X          pline("The bear trap prevents you from pulling your foot out.");
  1235. X          return(0);
  1236. X      }
  1237. X+     reset_remarm();            /* since you may change ordering */
  1238. X      (void) armoroff(otmp);
  1239. X      return(1);
  1240. X  }
  1241. X***************
  1242. X*** 1386,1391 ****
  1243. X--- 1391,1399 ----
  1244. X      return(1);        /* get busy */
  1245. X  }
  1246. X  
  1247. X+ void
  1248. X+ reset_remarm() { taking_off = takeoff_mask =0L; }
  1249. X+ 
  1250. X  int
  1251. X  doddoremarm() {
  1252. X  
  1253. X***************
  1254. X*** 1399,1404 ****
  1255. X--- 1407,1453 ----
  1256. X      (void) ggetobj("take off", select_off, 0);
  1257. X      if(takeoff_mask) return(take_off());
  1258. X      else         return(0);
  1259. X+ }
  1260. X+ 
  1261. X+ int
  1262. X+ destroy_arm(atmp)
  1263. X+ register struct obj *atmp;
  1264. X+ {
  1265. X+     register struct obj *otmp;
  1266. X+ 
  1267. X+     if((otmp = uarmc) && (!atmp || atmp == uarmc)) {
  1268. X+         Your("cloak crumbles and turns to dust!");
  1269. X+         (void) Cloak_off();
  1270. X+         useup(otmp);
  1271. X+     } else if((otmp = uarm) && (!atmp || atmp == uarm)) {
  1272. X+         Your("armor turns to dust and falls to the floor!");
  1273. X+         (void) Armor_gone();
  1274. X+         useup(otmp);
  1275. X+ #ifdef SHIRT
  1276. X+     } else if((otmp = uarmu) && (!atmp || atmp == uarmu)) {
  1277. X+         Your("shirt crumbles into tiny threads and falls apart!");
  1278. X+         useup(otmp);
  1279. X+ #endif
  1280. X+     } else if((otmp = uarmh) && (!atmp || atmp == uarmh)) {
  1281. X+         Your("helmet turns to dust and is blown away!");
  1282. X+         (void) Helmet_off();
  1283. X+         useup(otmp);
  1284. X+     } else if((otmp = uarmg) && (!atmp || atmp == uarmg)) {
  1285. X+         Your("gloves vanish!");
  1286. X+         (void) Gloves_off();
  1287. X+         useup(otmp);
  1288. X+         selftouch("You");
  1289. X+     } else if((otmp = uarmf) && (!atmp || atmp == uarmf)) {
  1290. X+         Your("boots disintegrate!");
  1291. X+         (void) Boots_off();
  1292. X+         useup(otmp);
  1293. X+     } else if((otmp =uarms) && (!atmp || atmp == uarms)) {
  1294. X+         Your("shield crumbles away!");
  1295. X+         (void) Shield_off();
  1296. X+         useup(otmp);
  1297. X+     } else     return(0);        /* could not destroy anything */
  1298. X+ 
  1299. X+     return(1);
  1300. X  }
  1301. X  
  1302. X  void
  1303. X*** src/Old/dog.c    Thu Aug  3 08:44:30 1989
  1304. X--- src/dog.c    Fri Aug 18 08:13:38 1989
  1305. X***************
  1306. X*** 129,135 ****
  1307. X              mtmp0->nmon = mtmp->nmon;
  1308. X              mtmp->nmon = fmon;
  1309. X              fmon = mtmp;
  1310. X!             if (mtmp->isshk)
  1311. X              home_shk(mtmp);
  1312. X              else
  1313. X              rloc(mtmp);
  1314. X--- 129,143 ----
  1315. X              mtmp0->nmon = mtmp->nmon;
  1316. X              mtmp->nmon = fmon;
  1317. X              fmon = mtmp;
  1318. X!             if (mtmp->data->geno & G_GENOD) {
  1319. X! #ifdef KOPS
  1320. X!             allow_kops = FALSE;
  1321. X! #endif
  1322. X!             mondead(mtmp);    /* must put in fmon list first */
  1323. X! #ifdef KOPS
  1324. X!             allow_kops = TRUE;
  1325. X! #endif
  1326. X!             } else if (mtmp->isshk)
  1327. X              home_shk(mtmp);
  1328. X              else
  1329. X              rloc(mtmp);
  1330. X***************
  1331. X*** 215,221 ****
  1332. X  struct monst *mon;
  1333. X  register struct obj *obj;
  1334. X  {
  1335. X!     boolean carn = carnivorous(mon->data);
  1336. X  
  1337. X      switch(obj->olet) {
  1338. X      case FOOD_SYM:
  1339. X--- 223,230 ----
  1340. X  struct monst *mon;
  1341. X  register struct obj *obj;
  1342. X  {
  1343. X!     boolean carni = carnivorous(mon->data);
  1344. X!     boolean herbi = herbivorous(mon->data);
  1345. X  
  1346. X      switch(obj->olet) {
  1347. X      case FOOD_SYM:
  1348. X***************
  1349. X*** 223,249 ****
  1350. X          !resists_ston(mon->data))
  1351. X              return TABU;
  1352. X  
  1353. X!         if (!carn && !herbivorous(mon->data))
  1354. X              return (obj->cursed ? UNDEF : APPORT);
  1355. X  
  1356. X          switch (obj->otyp) {
  1357. X          case TRIPE_RATION:
  1358. X!             return (carn ? DOGFOOD : MANFOOD);
  1359. X          case EGG:
  1360. X              if (obj->corpsenm == PM_COCKATRICE &&
  1361. X                          !resists_ston(mon->data))
  1362. X              return POISON;
  1363. X!             return (carn ? CADAVER : MANFOOD);
  1364. X          case CORPSE:
  1365. X              if ((obj->age+50 <= moves && mon->data->mlet != S_FUNGUS) ||
  1366. X              (poisonous(&mons[obj->corpsenm]) &&
  1367. X                          !resists_poison(mon->data)))
  1368. X              return POISON;
  1369. X!             else return (carn ? CADAVER : MANFOOD);
  1370. X          case DEAD_LIZARD:
  1371. X!             return (carn ? ACCFOOD : MANFOOD);
  1372. X          default:
  1373. X!             return (obj->otyp < CARROT ? ACCFOOD : MANFOOD);
  1374. X          }
  1375. X      default:
  1376. X          if(!obj->cursed) return(APPORT);
  1377. X--- 232,272 ----
  1378. X          !resists_ston(mon->data))
  1379. X              return TABU;
  1380. X  
  1381. X!         if (!carni && !herbi)
  1382. X              return (obj->cursed ? UNDEF : APPORT);
  1383. X  
  1384. X          switch (obj->otyp) {
  1385. X          case TRIPE_RATION:
  1386. X!             return (carni ? DOGFOOD : MANFOOD);
  1387. X          case EGG:
  1388. X              if (obj->corpsenm == PM_COCKATRICE &&
  1389. X                          !resists_ston(mon->data))
  1390. X              return POISON;
  1391. X!             return (carni ? CADAVER : MANFOOD);
  1392. X          case CORPSE:
  1393. X              if ((obj->age+50 <= moves && mon->data->mlet != S_FUNGUS) ||
  1394. X              (poisonous(&mons[obj->corpsenm]) &&
  1395. X                          !resists_poison(mon->data)))
  1396. X              return POISON;
  1397. X!             else return (carni ? CADAVER : MANFOOD);
  1398. X          case DEAD_LIZARD:
  1399. X!             return (carni ? ACCFOOD : MANFOOD);
  1400. X!         case CLOVE_OF_GARLIC:
  1401. X!             return (is_undead(mon->data) ? TABU :
  1402. X!                 (herbi ? ACCFOOD : MANFOOD));
  1403. X!         case TIN:
  1404. X!             return MANFOOD;
  1405. X!         case APPLE:
  1406. X!         case CARROT:
  1407. X!             return (herbi ? DOGFOOD : MANFOOD);
  1408. X          default:
  1409. X! #ifdef SLIME_MOLD
  1410. X!             return (obj->otyp > SLIME_MOLD ?
  1411. X! #else
  1412. X!             return (obj->otyp > CLOVE_OF_GARLIC ?
  1413. X! #endif
  1414. X!                 (carni ? ACCFOOD : MANFOOD) :
  1415. X!                 (herbi ? ACCFOOD : MANFOOD));
  1416. X          }
  1417. X      default:
  1418. X          if(!obj->cursed) return(APPORT);
  1419. X***************
  1420. X*** 302,311 ****
  1421. X         or get in your way */
  1422. X      if(obj) {
  1423. X          if(dogfood(mtmp, obj) >= MANFOOD) return(0);
  1424. X!         if(cansee(mtmp->mx,mtmp->my)){
  1425. X!             pline("%s devours the %s.", Monnam(mtmp),
  1426. X!                 objects[obj->otyp].oc_name);
  1427. X!         }
  1428. X          obfree(obj, (struct obj *)0);
  1429. X      }
  1430. X      mtmp2 = newmonst(sizeof(struct edog) + mtmp->mnamelth);
  1431. X--- 325,332 ----
  1432. X         or get in your way */
  1433. X      if(obj) {
  1434. X          if(dogfood(mtmp, obj) >= MANFOOD) return(0);
  1435. X!         if(cansee(mtmp->mx,mtmp->my))
  1436. X!             pline("%s devours the %s.", Monnam(mtmp), xname(obj));
  1437. X          obfree(obj, (struct obj *)0);
  1438. X      }
  1439. X      mtmp2 = newmonst(sizeof(struct edog) + mtmp->mnamelth);
  1440. X*** src/Old/dogmove.c    Wed Aug 16 12:16:10 1989
  1441. X--- src/dogmove.c    Tue Aug 15 18:49:35 1989
  1442. X***************
  1443. X*** 173,179 ****
  1444. X          if(appr == 0){
  1445. X              obj = invent;
  1446. X              while(obj){
  1447. X!                 if(obj->otyp == TRIPE_RATION){
  1448. X                      appr = 1;
  1449. X                      break;
  1450. X                  }
  1451. X--- 173,179 ----
  1452. X          if(appr == 0){
  1453. X              obj = invent;
  1454. X              while(obj){
  1455. X!                 if(dogfood(mtmp, obj) == DOGFOOD) {
  1456. X                      appr = 1;
  1457. X                      break;
  1458. X                  }
  1459. X***************
  1460. X*** 216,222 ****
  1461. X  
  1462. X                  if(mtmp2->m_lev >= mtmp->m_lev+2 ||
  1463. X                     (mtmp2->data->mlet == S_COCKATRICE &&
  1464. X!                 !(mtmp->data->mflags1 & M1_STON_RES)))
  1465. X                  continue;
  1466. X                  if(after) return(0); /* hit only once each move */
  1467. X  
  1468. X--- 216,222 ----
  1469. X  
  1470. X                  if(mtmp2->m_lev >= mtmp->m_lev+2 ||
  1471. X                     (mtmp2->data->mlet == S_COCKATRICE &&
  1472. X!                 !resists_ston(mtmp->data)))
  1473. X                  continue;
  1474. X                  if(after) return(0); /* hit only once each move */
  1475. X  
  1476. X*** src/Old/dokick.c    Wed Aug 16 12:16:29 1989
  1477. X--- src/dokick.c    Wed Aug 16 10:31:40 1989
  1478. X***************
  1479. X*** 50,56 ****
  1480. X          mon->mhp -= (!martial() ? rnd(dmg) :
  1481. X              rnd(dmg)+rnd(ACURR(A_DEX)/2));  
  1482. X      if(mon->mhp < 1) {
  1483. X!         (void) passive(mon, TRUE, 0);
  1484. X          killed(mon);
  1485. X          return;
  1486. X      }
  1487. X--- 50,56 ----
  1488. X          mon->mhp -= (!martial() ? rnd(dmg) :
  1489. X              rnd(dmg)+rnd(ACURR(A_DEX)/2));  
  1490. X      if(mon->mhp < 1) {
  1491. X!         (void) passive(mon, TRUE, 0, TRUE);
  1492. X          killed(mon);
  1493. X          return;
  1494. X      }
  1495. X***************
  1496. X*** 68,74 ****
  1497. X              set_apparxy(mon);
  1498. X              }
  1499. X      }
  1500. X!     (void) passive(mon, FALSE, 1);
  1501. X  
  1502. X  /*    it is unchivalrous to attack the defenseless or from behind */
  1503. X      if (pl_character[0] == 'K' && u.ualigntyp == U_LAWFUL && 
  1504. X--- 68,74 ----
  1505. X              set_apparxy(mon);
  1506. X              }
  1507. X      }
  1508. X!     (void) passive(mon, FALSE, 1, TRUE);
  1509. X  
  1510. X  /*    it is unchivalrous to attack the defenseless or from behind */
  1511. X      if (pl_character[0] == 'K' && u.ualigntyp == U_LAWFUL && 
  1512. X***************
  1513. X*** 85,90 ****
  1514. X--- 85,120 ----
  1515. X      register struct monst *mon = m_at(x, y);
  1516. X      register int i, j;
  1517. X  
  1518. X+     if(special_case(mon)) return;
  1519. X+     setmangry(mon);
  1520. X+ #ifdef POLYSELF
  1521. X+     /* Kick attacks by kicking monsters are normal attacks, not special.
  1522. X+      * If you have >1 kick attack, you get all of them.
  1523. X+      */
  1524. X+     if (attacktype(uasmon, AT_KICK)) {
  1525. X+         schar tmp = find_roll_to_hit(mon);
  1526. X+         for(i=0; i<NATTK; i++) {
  1527. X+         int sum = 0;
  1528. X+         if (uasmon->mattk[i].aatyp == AT_KICK && multi >= 0) {
  1529. X+             /* check multi; maybe they had 2 kicks and the first */
  1530. X+             /* was a kick against a floating eye */
  1531. X+             j = 1;
  1532. X+             if (tmp > rnd(20)) {
  1533. X+             kludge("You kick %s.", mon_nam(mon));
  1534. X+             sum = damageum(mon, &(uasmon->mattk[i]));
  1535. X+             if (sum == 2)
  1536. X+                 (void)passive(mon, 1, 0, TRUE);
  1537. X+             else (void)passive(mon, sum, 1, TRUE);
  1538. X+             } else {
  1539. X+             missum(mon, &(uasmon->mattk[i]));
  1540. X+             (void)passive(mon, 0, 1, TRUE);
  1541. X+             }
  1542. X+         }
  1543. X+         }
  1544. X+         return;
  1545. X+     }
  1546. X+ #endif
  1547. X+ 
  1548. X      /* no need to check POLYSELF since only ghosts, which you can't turn */
  1549. X      /* into, are noncorporeal */
  1550. X      if(noncorporeal(mon->data)) {
  1551. X***************
  1552. X*** 92,105 ****
  1553. X          return;
  1554. X      }
  1555. X  
  1556. X-     if(special_case(mon)) return;
  1557. X- 
  1558. X-     setmangry(mon);
  1559. X- 
  1560. X      if(Levitation && !rn2(3) && verysmall(mon->data) &&
  1561. X         !is_flyer(mon->data)) {
  1562. X          pline("Floating in the air, you miss wildly!");
  1563. X!         (void) passive(mon, FALSE, 1);
  1564. X          return;
  1565. X      }
  1566. X  
  1567. X--- 122,131 ----
  1568. X          return;
  1569. X      }
  1570. X  
  1571. X      if(Levitation && !rn2(3) && verysmall(mon->data) &&
  1572. X         !is_flyer(mon->data)) {
  1573. X          pline("Floating in the air, you miss wildly!");
  1574. X!         (void) passive(mon, FALSE, 1, TRUE);
  1575. X          return;
  1576. X      }
  1577. X  
  1578. X***************
  1579. X*** 110,116 ****
  1580. X          if(!rn2((i < j/10) ? 2 : (i < j/5) ? 3 : 4)) {
  1581. X              if(martial() && !rn2(2)) goto doit;
  1582. X              Your("clumsy kick does no damage.");
  1583. X!             (void) passive(mon, FALSE, 1);
  1584. X              return;
  1585. X          }
  1586. X          if(i < j/10) clumsy = TRUE;
  1587. X--- 136,142 ----
  1588. X          if(!rn2((i < j/10) ? 2 : (i < j/5) ? 3 : 4)) {
  1589. X              if(martial() && !rn2(2)) goto doit;
  1590. X              Your("clumsy kick does no damage.");
  1591. X!             (void) passive(mon, FALSE, 1, TRUE);
  1592. X              return;
  1593. X          }
  1594. X          if(i < j/10) clumsy = TRUE;
  1595. X***************
  1596. X*** 130,136 ****
  1597. X          if(!nohands(mon->data) && !rn2(martial() ? 5 : 3)) {
  1598. X              kludge("%s blocks your %skick.", Monnam(mon), 
  1599. X                  clumsy ? "clumsy " : "");
  1600. X!             (void) passive(mon, FALSE, 1);
  1601. X              return;
  1602. X          } else {
  1603. X              mnexto(mon);
  1604. X--- 156,162 ----
  1605. X          if(!nohands(mon->data) && !rn2(martial() ? 5 : 3)) {
  1606. X              kludge("%s blocks your %skick.", Monnam(mon), 
  1607. X                  clumsy ? "clumsy " : "");
  1608. X!             (void) passive(mon, FALSE, 1, TRUE);
  1609. X              return;
  1610. X          } else {
  1611. X              mnexto(mon);
  1612. X***************
  1613. X*** 138,150 ****
  1614. X                  pline("%s %s, %s evading your %skick.", 
  1615. X                  Blind ? "It" : Monnam(mon),
  1616. X                  (can_teleport(mon->data) ? "teleports" :
  1617. X-                  is_flyer(mon->data) ? "flutters" :
  1618. X                   is_floater(mon->data) ? "floats" :
  1619. X                   nolimbs(mon->data) ? "slides" :
  1620. X                   "jumps"),
  1621. X                  clumsy ? "easily" : "nimbly",
  1622. X                  clumsy ? "clumsy " : "");
  1623. X!             (void) passive(mon, FALSE, 1);
  1624. X                  return;
  1625. X              } 
  1626. X          }
  1627. X--- 164,176 ----
  1628. X                  pline("%s %s, %s evading your %skick.", 
  1629. X                  Blind ? "It" : Monnam(mon),
  1630. X                  (can_teleport(mon->data) ? "teleports" :
  1631. X                   is_floater(mon->data) ? "floats" :
  1632. X+                  is_flyer(mon->data) ? "flutters" :
  1633. X                   nolimbs(mon->data) ? "slides" :
  1634. X                   "jumps"),
  1635. X                  clumsy ? "easily" : "nimbly",
  1636. X                  clumsy ? "clumsy " : "");
  1637. X!             (void) passive(mon, FALSE, 1, TRUE);
  1638. X                  return;
  1639. X              } 
  1640. X          }
  1641. X*** src/Old/dothrow.c    Wed Aug 16 12:16:53 1989
  1642. X--- src/dothrow.c    Wed Aug  9 19:21:56 1989
  1643. X***************
  1644. X*** 251,258 ****
  1645. X          }
  1646. X          return(1);
  1647. X      }
  1648. X!     if(obj->olet == WEAPON_SYM || obj->otyp == ROCK || obj->olet == GEM_SYM) {
  1649. X!         if(obj->otyp < DART || obj->otyp == ROCK || obj->olet == GEM_SYM) {
  1650. X              if (!uwep ||
  1651. X              objects[obj->otyp].w_propellor !=
  1652. X              -objects[uwep->otyp].w_propellor)
  1653. X--- 251,258 ----
  1654. X          }
  1655. X          return(1);
  1656. X      }
  1657. X!     if(obj->olet == WEAPON_SYM || obj->otyp == PICK_AXE || obj->olet == GEM_SYM) {
  1658. X!         if(obj->otyp < DART || obj->olet == GEM_SYM) {
  1659. X              if (!uwep ||
  1660. X              objects[obj->otyp].w_propellor !=
  1661. X              -objects[uwep->otyp].w_propellor)
  1662. X*** src/Old/eat.c    Wed Aug 16 12:17:14 1989
  1663. X--- src/eat.c    Tue Aug 15 20:36:37 1989
  1664. X***************
  1665. X*** 127,133 ****
  1666. X              You("turn to stone.");
  1667. X              Sprintf(killer, "%s meat",
  1668. X                        mons[pm].mname);
  1669. X!             done("stoned");
  1670. X  #ifdef POLYSELF
  1671. X          }
  1672. X  #endif
  1673. X--- 127,133 ----
  1674. X              You("turn to stone.");
  1675. X              Sprintf(killer, "%s meat",
  1676. X                        mons[pm].mname);
  1677. X!             done(STONING);
  1678. X  #ifdef POLYSELF
  1679. X          }
  1680. X  #endif
  1681. X***************
  1682. X*** 409,422 ****
  1683. X  /* Created by GAN 01/28/87
  1684. X   * Amended by AKP 09/22/87: if not hard, don't choke, just vomit.
  1685. X   * Amended by 3.  06/12/89: if not hard, sometimes choke anyway, to keep risk.
  1686. X-  *
  1687. X-  * Note that if you have enough food, you can always stop being Sick!
  1688. X-  * choke() returns if you don't choke, kills you if you do.
  1689. X   */
  1690. X  /*ARGSUSED*/
  1691. X  static void
  1692. X  choke(food)
  1693. X! register struct objclass *food;
  1694. X  {
  1695. X      /* only happens if you were satiated */
  1696. X      if(u.uhs != SATIATED) return;
  1697. X--- 409,419 ----
  1698. X  /* Created by GAN 01/28/87
  1699. X   * Amended by AKP 09/22/87: if not hard, don't choke, just vomit.
  1700. X   * Amended by 3.  06/12/89: if not hard, sometimes choke anyway, to keep risk.
  1701. X   */
  1702. X  /*ARGSUSED*/
  1703. X  static void
  1704. X  choke(food)
  1705. X! register struct obj *food;
  1706. X  {
  1707. X      /* only happens if you were satiated */
  1708. X      if(u.uhs != SATIATED) return;
  1709. X***************
  1710. X*** 431,441 ****
  1711. X          vomit();
  1712. X      } else {
  1713. X  #endif
  1714. X!         if(food)    killer = food->oc_name;
  1715. X!         else        killer = "exuberant appetite";
  1716. X          You("choke over your food.");
  1717. X          You("die...");
  1718. X!         done("choked");
  1719. X  #ifndef HARD
  1720. X      }
  1721. X  #endif
  1722. X--- 428,443 ----
  1723. X          vomit();
  1724. X      } else {
  1725. X  #endif
  1726. X!         if(food) {
  1727. X!             int savequan = food->quan;
  1728. X!             food->quan = 1;
  1729. X!             killer = xname(food);
  1730. X!             food->quan = savequan;
  1731. X!         } else
  1732. X!             killer = "exuberant appetite";
  1733. X          You("choke over your food.");
  1734. X          You("die...");
  1735. X!         done(CHOKING);
  1736. X  #ifndef HARD
  1737. X      }
  1738. X  #endif
  1739. X***************
  1740. X*** 508,514 ****
  1741. X          rottenfood();
  1742. X          lesshungry(ftmp->nutrition >> 2);
  1743. X          } else {
  1744. X!         if(u.uhunger >= 1500) choke(ftmp);
  1745. X  
  1746. X          switch(otmp->otyp){
  1747. X          case FOOD_RATION:
  1748. X--- 510,516 ----
  1749. X          rottenfood();
  1750. X          lesshungry(ftmp->nutrition >> 2);
  1751. X          } else {
  1752. X!         if(u.uhunger >= 1500) choke(otmp);
  1753. X  
  1754. X          switch(otmp->otyp){
  1755. X          case FOOD_RATION:
  1756. X***************
  1757. X*** 617,623 ****
  1758. X                      u.uhp = u.uhpmax;
  1759. X                  } else if(u.uhp <= 0) {
  1760. X                      killer = "rotten jelly lump";
  1761. X!                     done("died");
  1762. X                  }
  1763. X                  if(!otmp->cursed) heal_legs();
  1764. X                  break;
  1765. X--- 619,625 ----
  1766. X                      u.uhp = u.uhpmax;
  1767. X                  } else if(u.uhp <= 0) {
  1768. X                      killer = "rotten jelly lump";
  1769. X!                     done(POISONING);
  1770. X                  }
  1771. X                  if(!otmp->cursed) heal_legs();
  1772. X                  break;
  1773. X***************
  1774. X*** 701,707 ****
  1775. X  register int num;
  1776. X  {
  1777. X      u.uhunger += num;
  1778. X!     if(u.uhunger >= 2000) choke((struct objclass *) 0);
  1779. X      else {
  1780. X          /* Have lesshungry() report when you're nearly full so all eating
  1781. X           * warns when you're about to choke.
  1782. X--- 703,709 ----
  1783. X  register int num;
  1784. X  {
  1785. X      u.uhunger += num;
  1786. X!     if(u.uhunger >= 2000) choke((struct obj *) 0);
  1787. X      else {
  1788. X          /* Have lesshungry() report when you're nearly full so all eating
  1789. X           * warns when you're about to choke.
  1790. X***************
  1791. X*** 749,755 ****
  1792. X              flags.botl = 1;
  1793. X              bot();
  1794. X              You("die from starvation.");
  1795. X!             done("starved");
  1796. X          }
  1797. X      }
  1798. X  
  1799. X--- 751,757 ----
  1800. X              flags.botl = 1;
  1801. X              bot();
  1802. X              You("die from starvation.");
  1803. X!             done(STARVING);
  1804. X          }
  1805. X      }
  1806. X  
  1807. X***************
  1808. X*** 785,791 ****
  1809. X          if(u.uhp < 1) {
  1810. X              You("die from hunger and exhaustion.");
  1811. X              killer = "exhaustion";
  1812. X!             done("starved");
  1813. X          }
  1814. X      }
  1815. X  }
  1816. X--- 787,793 ----
  1817. X          if(u.uhp < 1) {
  1818. X              You("die from hunger and exhaustion.");
  1819. X              killer = "exhaustion";
  1820. X!             done(STARVING);
  1821. X          }
  1822. X      }
  1823. X  }
  1824. X*** src/Old/fountain.c    Wed Aug 16 12:18:56 1989
  1825. X--- src/fountain.c    Tue Aug 15 18:48:37 1989
  1826. X***************
  1827. X*** 87,92 ****
  1828. X--- 87,93 ----
  1829. X          levl[mx][my].typ = POOL;
  1830. X          levl[mx][my].doormask = 0;
  1831. X          if(!Blind) atl(mx,my,(char) POOL_SYM);
  1832. X+         else levl[mx][my].seen = 0;
  1833. X          madepool = 1;
  1834. X      }
  1835. X  
  1836. X*** src/Old/hack.c    Sat Jul 29 01:11:26 1989
  1837. X--- src/hack.c    Wed Aug 16 22:18:51 1989
  1838. X***************
  1839. X*** 114,119
  1840. X                  You("push the boulder into a pit!");
  1841. X                  deltrap(ttmp);
  1842. X                  delobj(otmp);
  1843. X                  if(flags.verbose)
  1844. X                      pline("It completely fills the pit!");
  1845. X                  continue;
  1846. X
  1847. X--- 114,121 -----
  1848. X                  You("push the boulder into a pit!");
  1849. X                  deltrap(ttmp);
  1850. X                  delobj(otmp);
  1851. X+                 if(cansee(rx,ry)) newsym(rx,ry);
  1852. X+                 else levl[rx][ry].seen = 0;
  1853. X                  if(flags.verbose)
  1854. X                      pline("It completely fills the pit!");
  1855. X                  continue;
  1856. X***************
  1857. X*** 121,126
  1858. X                  pline("The boulder falls into and plugs a hole in the ground!");
  1859. X                  deltrap(ttmp);
  1860. X                  delobj(otmp);
  1861. X                  continue;
  1862. X                  case LEVEL_TELEP:
  1863. X                  case TELEP_TRAP:
  1864. X
  1865. X--- 123,130 -----
  1866. X                  pline("The boulder falls into and plugs a hole in the ground!");
  1867. X                  deltrap(ttmp);
  1868. X                  delobj(otmp);
  1869. X+                 if(cansee(rx,ry)) newsym(rx,ry);
  1870. X+                 else levl[rx][ry].seen = 0;
  1871. X                  continue;
  1872. X                  case LEVEL_TELEP:
  1873. X                  case TELEP_TRAP:
  1874. X***************
  1875. X*** 300,306
  1876. X  domove() {
  1877. X      register struct monst *mtmp = (struct monst *)0;
  1878. X      register struct rm *tmpr,*ust;
  1879. X!     register xchar x,y;
  1880. X      struct trap *trap;
  1881. X  
  1882. X      u_wipe_engr(rnd(5));
  1883. X
  1884. X--- 304,310 -----
  1885. X  domove() {
  1886. X      register struct monst *mtmp = (struct monst *)0;
  1887. X      register struct rm *tmpr,*ust;
  1888. X!     register xchar x,y,xx,yy;
  1889. X      struct trap *trap;
  1890. X  
  1891. X      u_wipe_engr(rnd(5));
  1892. X***************
  1893. X*** 312,317
  1894. X      }
  1895. X      if(u.uswallow) {
  1896. X          u.dx = u.dy = 0;
  1897. X          x = u.ux = u.ustuck->mx;
  1898. X          y = u.uy = u.ustuck->my;
  1899. X      } else {
  1900. X
  1901. X--- 316,323 -----
  1902. X      }
  1903. X      if(u.uswallow) {
  1904. X          u.dx = u.dy = 0;
  1905. X+         xx = u.ux;
  1906. X+         yy = u.uy;
  1907. X          x = u.ux = u.ustuck->mx;
  1908. X          y = u.uy = u.ustuck->my;
  1909. X          if(xx != u.ustuck->mx || yy != u.ustuck->my) newsym(xx,yy);
  1910. X***************
  1911. X*** 314,319
  1912. X          u.dx = u.dy = 0;
  1913. X          x = u.ux = u.ustuck->mx;
  1914. X          y = u.uy = u.ustuck->my;
  1915. X      } else {
  1916. X          x = u.ux + u.dx;
  1917. X          y = u.uy + u.dy;
  1918. X
  1919. X--- 320,326 -----
  1920. X          yy = u.uy;
  1921. X          x = u.ux = u.ustuck->mx;
  1922. X          y = u.uy = u.ustuck->my;
  1923. X+         if(xx != u.ustuck->mx || yy != u.ustuck->my) newsym(xx,yy);
  1924. X      } else {
  1925. X          x = u.ux + u.dx;
  1926. X          y = u.uy + u.dy;
  1927. X***************
  1928. X*** 399,405
  1929. X      if(u.utrap) {
  1930. X          if(u.utraptype == TT_PIT) {
  1931. X              if(flags.verbose)
  1932. X!             You("are still in a pit.");
  1933. X              u.utrap--;
  1934. X          } else if (u.utraptype == TT_WEB) {
  1935. X              if(flags.verbose)
  1936. X
  1937. X--- 406,412 -----
  1938. X      if(u.utrap) {
  1939. X          if(u.utraptype == TT_PIT) {
  1940. X              if(flags.verbose)
  1941. X!             Norep("You are still in a pit.");
  1942. X              u.utrap--;
  1943. X          } else if (u.utraptype == TT_WEB) {
  1944. X              if(flags.verbose)
  1945. X***************
  1946. X*** 403,409
  1947. X              u.utrap--;
  1948. X          } else if (u.utraptype == TT_WEB) {
  1949. X              if(flags.verbose)
  1950. X!                 You("are stuck to the web.");
  1951. X              u.utrap--;
  1952. X          } else {
  1953. X              if(flags.verbose)
  1954. X
  1955. X--- 410,416 -----
  1956. X              u.utrap--;
  1957. X          } else if (u.utraptype == TT_WEB) {
  1958. X              if(flags.verbose)
  1959. X!                 Norep("You are stuck to the web.");
  1960. X              u.utrap--;
  1961. X          } else {
  1962. X              if(flags.verbose)
  1963. X***************
  1964. X*** 407,413
  1965. X              u.utrap--;
  1966. X          } else {
  1967. X              if(flags.verbose)
  1968. X!             You("are caught in a bear trap.");
  1969. X              if((u.dx && u.dy) || !rn2(5)) u.utrap--;
  1970. X          }
  1971. X          return;
  1972. X
  1973. X--- 414,420 -----
  1974. X              u.utrap--;
  1975. X          } else {
  1976. X              if(flags.verbose)
  1977. X!             Norep("You are caught in a bear trap.");
  1978. X              if((u.dx && u.dy) || !rn2(5)) u.utrap--;
  1979. X          }
  1980. X          return;
  1981. X***************
  1982. X*** 535,540
  1983. X  #endif
  1984. X      u.ux += u.dx;
  1985. X      u.uy += u.dy;
  1986. X      if(flags.run) {
  1987. X          if(IS_DOOR(tmpr->typ) ||
  1988. X  #ifdef POLYSELF
  1989. X
  1990. X--- 542,548 -----
  1991. X  #endif
  1992. X      u.ux += u.dx;
  1993. X      u.uy += u.dy;
  1994. X+     reset_occupations();
  1995. X      if(flags.run) {
  1996. X          if(IS_DOOR(tmpr->typ) ||
  1997. X  #ifdef POLYSELF
  1998. X***************
  1999. X*** 688,694
  2000. X      for(x = u.ux-1; x <= u.ux+1; x++) for(y = u.uy-1; y <= u.uy+1; y++) {
  2001. X          if(x == u.ux && y == u.uy) continue;
  2002. X          if(levl[x][y].mmask && (mtmp = m_at(x,y)) && !mtmp->mimic &&
  2003. X!             (!mtmp->minvis || See_invisible) && !mtmp->mundetected) {
  2004. X              if((flags.run != 1 && !mtmp->mtame) || (x == u.ux+u.dx && y == u.uy+u.dy))
  2005. X                  goto stop;
  2006. X          } else mtmp = 0;
  2007. X
  2008. X--- 696,702 -----
  2009. X      for(x = u.ux-1; x <= u.ux+1; x++) for(y = u.uy-1; y <= u.uy+1; y++) {
  2010. X          if(x == u.ux && y == u.uy) continue;
  2011. X          if(levl[x][y].mmask && (mtmp = m_at(x,y)) && !mtmp->mimic &&
  2012. X!             (!mtmp->minvis || See_invisible || Telepat) && !mtmp->mundetected) {
  2013. X              if((flags.run != 1 && !mtmp->mtame) || (x == u.ux+u.dx && y == u.uy+u.dy))
  2014. X                  goto stop;
  2015. X          } else mtmp = 0;
  2016. X***************
  2017. X*** 792,798
  2018. X             !mtmp->mtame && !mtmp->mpeaceful &&
  2019. X             !noattacks(mtmp->data) &&
  2020. X             !mtmp->mfroz && !mtmp->msleep &&  /* aplvax!jcn */
  2021. X!            (!mtmp->minvis || See_invisible) &&
  2022. X             !onscary(u.ux, u.uy, mtmp))
  2023. X              return(1);
  2024. X      }
  2025. X
  2026. X--- 800,806 -----
  2027. X             !mtmp->mtame && !mtmp->mpeaceful &&
  2028. X             !noattacks(mtmp->data) &&
  2029. X             !mtmp->mfroz && !mtmp->msleep &&  /* aplvax!jcn */
  2030. X!            (!mtmp->minvis || See_invisible || Telepat) &&
  2031. X             !onscary(u.ux, u.uy, mtmp))
  2032. X              return(1);
  2033. X      }
  2034. X***************
  2035. X*** 804,810
  2036. X  xchar x,y;
  2037. X  {
  2038. X      if(Blind || (u.uswallow && (x != u.ux || y != u.uy))) return(0);
  2039. X-     if(dist(x,y) < 3) return(1);
  2040. X      if(IS_ROCK(levl[x][y].typ) && levl[u.ux][u.uy].typ == CORR &&
  2041. X                              !levl[u.ux][u.uy].lit)
  2042. X          return(0);
  2043. X
  2044. X--- 812,817 -----
  2045. X  xchar x,y;
  2046. X  {
  2047. X      if(Blind || (u.uswallow && (x != u.ux || y != u.uy))) return(0);
  2048. X      if(IS_ROCK(levl[x][y].typ) && levl[u.ux][u.uy].typ == CORR &&
  2049. X                  !levl[x][y].mmask && !levl[u.ux][u.uy].lit)
  2050. X          return(0);
  2051. X***************
  2052. X*** 806,812
  2053. X      if(Blind || (u.uswallow && (x != u.ux || y != u.uy))) return(0);
  2054. X      if(dist(x,y) < 3) return(1);
  2055. X      if(IS_ROCK(levl[x][y].typ) && levl[u.ux][u.uy].typ == CORR &&
  2056. X!                             !levl[u.ux][u.uy].lit)
  2057. X          return(0);
  2058. X      if(levl[x][y].lit &&
  2059. X          ((seelx <= x && x <= seehx && seely <= y && y <= seehy) ||
  2060. X
  2061. X--- 813,819 -----
  2062. X  {
  2063. X      if(Blind || (u.uswallow && (x != u.ux || y != u.uy))) return(0);
  2064. X      if(IS_ROCK(levl[x][y].typ) && levl[u.ux][u.uy].typ == CORR &&
  2065. X!                 !levl[x][y].mmask && !levl[u.ux][u.uy].lit)
  2066. X          return(0);
  2067. X      if(dist(x,y) < 3) return(1);
  2068. X      if(levl[x][y].lit &&
  2069. X***************
  2070. X*** 808,813
  2071. X      if(IS_ROCK(levl[x][y].typ) && levl[u.ux][u.uy].typ == CORR &&
  2072. X                              !levl[u.ux][u.uy].lit)
  2073. X          return(0);
  2074. X      if(levl[x][y].lit &&
  2075. X          ((seelx <= x && x <= seehx && seely <= y && y <= seehy) ||
  2076. X          (seelx2 <= x && x <= seehx2 && seely2 <= y && y <= seehy2)))
  2077. X
  2078. X--- 815,821 -----
  2079. X      if(IS_ROCK(levl[x][y].typ) && levl[u.ux][u.uy].typ == CORR &&
  2080. X                  !levl[x][y].mmask && !levl[u.ux][u.uy].lit)
  2081. X          return(0);
  2082. X+     if(dist(x,y) < 3) return(1);
  2083. X      if(levl[x][y].lit &&
  2084. X          ((seelx <= x && x <= seehx && seely <= y && y <= seehy) ||
  2085. X          (seelx2 <= x && x <= seehx2 && seely2 <= y && y <= seehy2)))
  2086. X***************
  2087. X*** 935,941
  2088. X      if(u.uhp < 1) {
  2089. X          killer = knam;    /* the thing that killed you */
  2090. X          You("die...");
  2091. X!         done("died");
  2092. X      } else if(u.uhp*10 < u.uhpmax && moves-wailmsg > 50 && n > 0){
  2093. X          wailmsg = moves;
  2094. X          if(index("WEV", pl_character[0])) {
  2095. X
  2096. X--- 943,949 -----
  2097. X      if(u.uhp < 1) {
  2098. X          killer = knam;    /* the thing that killed you */
  2099. X          You("die...");
  2100. X!         done(DIED);
  2101. X      } else if(u.uhp*10 < u.uhpmax && moves-wailmsg > 50 && n > 0){
  2102. X          wailmsg = moves;
  2103. X          if(index("WEV", pl_character[0])) {
  2104. X***************
  2105. X*** 1030,1035
  2106. X          otmp = otmp->nobj;
  2107. X      }
  2108. X      return(ct);
  2109. X  }
  2110. X  
  2111. X  #ifdef STUPID_CPP    /* otherwise these functions are macros in hack.h */
  2112. X
  2113. X--- 1038,1053 -----
  2114. X          otmp = otmp->nobj;
  2115. X      }
  2116. X      return(ct);
  2117. X+ }
  2118. X+ 
  2119. X+ int
  2120. X+ identify(otmp)        /* also called by newmail() */
  2121. X+     register struct obj *otmp;
  2122. X+ {
  2123. X+     makeknown(otmp->otyp);
  2124. X+     otmp->known = otmp->dknown = otmp->bknown = 1;
  2125. X+     prinv(otmp);
  2126. X+     return(1);
  2127. X  }
  2128. X  
  2129. X  #ifdef STUPID_CPP    /* otherwise these functions are macros in hack.h */
  2130. X*** src/Old/invent.c    Wed Aug 16 12:20:27 1989
  2131. X--- src/invent.c    Tue Aug 15 20:34:29 1989
  2132. X***************
  2133. X*** 660,666 ****
  2134. X      olets[0] = 0;
  2135. X      while(sym = *ip++){
  2136. X          if(sym == ' ') continue;
  2137. X!         if(takeoff) {
  2138. X              if(!index(removeables,sym)) {
  2139. X              pline("Not applicable.");
  2140. X              return(0);
  2141. X--- 660,666 ----
  2142. X      olets[0] = 0;
  2143. X      while(sym = *ip++){
  2144. X          if(sym == ' ') continue;
  2145. X!         if(takeoff && !(uwep && sym == uwep->olet)) {
  2146. X              if(!index(removeables,sym)) {
  2147. X              pline("Not applicable.");
  2148. X              return(0);
  2149. X***************
  2150. X*** 1082,1089 ****
  2151. X                     (otmp->otyp == CORPSE && otmp->corpsenm == PM_COCKATRICE)) {
  2152. X                  pline("Touching the dead cockatrice is a fatal mistake...");
  2153. X                  You("turn to stone...");
  2154. X!                 killer = "dead cockatrice";
  2155. X!                  done("stoned");
  2156. X                  }
  2157. X          }
  2158. X          }
  2159. X--- 1082,1089 ----
  2160. X                     (otmp->otyp == CORPSE && otmp->corpsenm == PM_COCKATRICE)) {
  2161. X                  pline("Touching the dead cockatrice is a fatal mistake...");
  2162. X                  You("turn to stone...");
  2163. X!                 killer = "cockatrice corpse";
  2164. X!                 done(STONING);
  2165. X                  }
  2166. X          }
  2167. X          }
  2168. X*** src/Old/ioctl.c    Wed Aug 16 12:21:02 1989
  2169. X--- src/ioctl.c    Sat Aug  5 13:03:55 1989
  2170. X***************
  2171. X*** 26,31 ****
  2172. X--- 26,50 ----
  2173. X  #else
  2174. X      (void) ioctl(fileno(stdin), (int) TCGETA, &termio);
  2175. X  #endif
  2176. X+ #ifdef TIOCGWINSZ
  2177. X+     {
  2178. X+         /*
  2179. X+          * ttysize is found on Suns and BSD
  2180. X+          * winsize is found on Suns, BSD, and Ultrix
  2181. X+          */
  2182. X+         struct winsize ttsz;
  2183. X+ 
  2184. X+         (void) ioctl(fileno(stdin), (int) TIOCGWINSZ, (char *) &ttsz);
  2185. X+         /*
  2186. X+          * Use the kernel's values for lines and columns if it has
  2187. X+          * any idea.
  2188. X+          */
  2189. X+         if (ttsz.ws_row)
  2190. X+             LI = ttsz.ws_row;
  2191. X+         if (ttsz.ws_col)
  2192. X+             CO = ttsz.ws_col;
  2193. X+     }
  2194. X+ #endif
  2195. X  }
  2196. X  
  2197. X  void
  2198. END_OF_FILE
  2199. if test 56848 -ne `wc -c <'patch02c'`; then
  2200.     echo shar: \"'patch02c'\" unpacked with wrong size!
  2201. fi
  2202. # end of 'patch02c'
  2203. fi
  2204. echo shar: End of archive 3 \(of 7\).
  2205. cp /dev/null ark3isdone
  2206. MISSING=""
  2207. for I in 1 2 3 4 5 6 7 ; do
  2208.     if test ! -f ark${I}isdone ; then
  2209.     MISSING="${MISSING} ${I}"
  2210.     fi
  2211. done
  2212. if test "${MISSING}" = "" ; then
  2213.     echo You have unpacked all 7 archives.
  2214.     rm -f ark[1-9]isdone
  2215. else
  2216.     echo You still need to unpack the following archives:
  2217.     echo "        " ${MISSING}
  2218. fi
  2219. ##  End of shell archive.
  2220. exit 0
  2221.